package model;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Transient;

/**
 * Benoegtigte Lib: WebContent/WEB-INF/lib/ejb3-persistence.jar Letzte
 * Aenderung: 09.06.12 SB
 */
@Entity
// Die Annotation @Entity dient dazu eine Klasse als persistent zu definieren.
@Table(name = "Person")
// Falls die Tabelle in der Datenbank nicht denselben Namen hat wie die Klasse
// so kann der Tabellenname mit Hilfe der Annotation @Table definiert werden.
public class Person {
	@Id
	// Annotation @Id, gibt an, welches Attribut der Klasse als Identität
	// (Primärschlüssel) fungieren soll
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	// Die Identität eines Objektes kann mit dieser Annotation auch automatisch
	// generiert werden.
	@Column(name = "PID")
	// Die Annotation dient dazu, das Attribut in der Datenbank zu definieren;
	// (Bsp: name="familienname", length=30, nullable=false)
	private Integer id;
	private String Name;
	private String VName;
	private String Adresse;
	private String PLZ;
	private String Ort;
	private String EMail;
	private String PWD;
	private boolean isAdmin;

	@ManyToOne(targetEntity = TypStatus.class)
	@JoinColumn(name = "stCouch", nullable = true)
	private TypStatus stCouch;

	@ManyToOne(targetEntity = TypStatus.class)
	@JoinColumn(name = "stInternet", nullable = true)
	private TypStatus stInternet;

	@ManyToOne(targetEntity = TypStatus.class)
	@JoinColumn(name = "stZeigeStadt", nullable = true)
	private TypStatus stZeigeStadt;

	@ManyToOne(targetEntity = TypStatus.class)
	@JoinColumn(name = "stParkplatz", nullable = true)
	private TypStatus stParkplatz;

	// Nicht DB-Attribut; wird zur Berechnung der Durchschnittsbewertung
	// verwendet.
	// Transientes Attribut wird nicht in der Datenbank gespeichert.
	// transient private double avgNote;

	@Transient
	private double avgNote;

	@Transient
	private int countAnfragen;

	/*
	 * Beispiel transientes Attribut // Transientes Attribut wird nicht in der
	 * Datenbank gespeichert.
	 * 
	 * @Transient private int age;
	 */

	/*
	 * evt. Liste Anbieter und Angebote // Eine Menge von Strings (Kardinalität
	 * M)
	 * 
	 * @ElementCollection // Diese Annotation dient dazu die Namen der
	 * Hilfstabelle und des Fremdschluessels zu definieren
	 * 
	 * @CollectionTable(name="personenhobby",
	 * joinColumns=@JoinColumn(name="pNr")) // Diese Annotation dient dazu, den
	 * Namen des Datenfeldes in der Hilstabelle zu definieren
	 * 
	 * @Column(name="hobby") private Collection<String> hobbies = new
	 * HashSet<String>();
	 */

	/**
	 * Klassenkonstruktor; Belegung der Klassenattribute mit Standardwerte
	 */
	public Person() {
		this.setId(0);
		this.setVorname("");
		this.setNachname("");
		this.setAdresse("");
		this.setEMail("");
		this.setOrt("");
		this.setPLZ("");
		this.setPWD("");
		this.setIsAdmin(false);
		this.setStateCouch(new TypStatus());
		this.setStateInternet(new TypStatus());
		this.setStateParkplatz(new TypStatus());
		this.setStateZeigeStadt(new TypStatus());
	}

	public Person(Person person) {
		this.setVorname(person.getVorname());
		this.setNachname(person.getNachname());
		this.setAdresse(person.getAdresse());
		this.setEMail(person.getEMail());
		this.setId(person.getId());
		this.setOrt(person.getOrt());
		this.setPLZ(person.getPLZ());
		this.setPWD(person.getPWD());
		this.setIsAdmin(person.getIsAdmin());
		this.setStateCouch(person.getStateCouch());
		this.setStateInternet(person.getStateInternet());
		this.setStateParkplatz(person.getStateParkplatz());
		this.setStateZeigeStadt(person.getStateZeigeStadt());
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getNachname() {
		return Name;
	}

	public void setNachname(String Nachname) {
		this.Name = Nachname;
	}

	public String getVorname() {
		return VName;
	}

	public void setVorname(String Vorname) {
		this.VName = Vorname;
	}

	public String getAdresse() {
		return Adresse;
	}

	public void setAdresse(String Adresse) {
		this.Adresse = Adresse;
	}

	public String getPLZ() {
		return PLZ;
	}

	public void setPLZ(String PLZ) {
		this.PLZ = PLZ;
	}

	public String getOrt() {
		return Ort;
	}

	public void setOrt(String Ort) {
		this.Ort = Ort;
	}

	public String getEMail() {
		return EMail;
	}

	public void setEMail(String EMail) {
		this.EMail = EMail;
	}

	public String getPWD() {
		return PWD;
	}

	public void setPWD(String PWD) {
		this.PWD = PWD;
	}

	public boolean getIsAdmin() {
		return isAdmin;
	}

	public void setIsAdmin(boolean isAdmin) {
		this.isAdmin = isAdmin;
	}

	public TypStatus getStateCouch() {
		return stCouch;
	}

	public void setStateCouch(TypStatus stCouch) {
		this.stCouch = stCouch;
	}

	public TypStatus getStateInternet() {
		return stInternet;
	}

	public void setStateInternet(TypStatus stInternet) {
		this.stInternet = stInternet;
	}

	public TypStatus getStateZeigeStadt() {
		return stZeigeStadt;
	}

	public void setStateZeigeStadt(TypStatus stZeigeStadt) {
		this.stZeigeStadt = stZeigeStadt;
	}

	public TypStatus getStateParkplatz() {
		return stParkplatz;
	}

	public void setStateParkplatz(TypStatus stParkplatz) {
		this.stParkplatz = stParkplatz;
	}

	public double getAvgNote() {
		return avgNote;
	}

	public void setAvgNote(double avgNote) {
		this.avgNote = avgNote;
	}

	public String toString() {
		String s = "[Id=" + getId() + "]\t[vname=" + getVorname() + "]\t[name="
				+ getNachname() + "]\t[adresse=" + getAdresse() + "]\t[email="
				+ getEMail() + "]\t[plz=" + getPLZ()
				+ "]\t[PWD=*****]\t[IsAdmin=" + getIsAdmin()
				+ "]\t[StateCouch=" + getStateCouch().getBezeichnung()
				+ "]\t[StateInternet=" + getStateInternet().getBezeichnung()
				+ "]\t[StateParkplatz=" + getStateParkplatz().getBezeichnung()
				+ "]\t[StateZeigeStadt="
				+ getStateZeigeStadt().getBezeichnung() + "]";
		return s;
	}

	/**
	 * Generiert ein Zufallspasswort von 8 Zeichen
	 * 
	 */
	public void generateRandomPWD() {
		// Generiert ein Passwort von 8 Zeichen
		String validValues = "abcdefgijkmnopqrstwxyzABCDEFGHJKLMNPQRSTWXYZ0123456789";

		// Die Zufallsberechnung steckt in "Math.random()". Diese Methode
		// erzeugt eine Zahl zwischen 0.0000000000000000 bis 0.9999999999999999.
		// Durch Multiplikation und addition kann man bestimmte Wertebereiche
		// bestimmen
		// (int)(Math.random()* ((maximum- minimum) + 1) + minimum)
		int random;
		int maxLength = 8;
		StringBuffer password = new StringBuffer();

		for (int j = 0; j < maxLength; j++) {
			random = (int) (Math.random() * ((validValues.length() - 1) + 1) + 0);
			password.append(validValues.charAt(random));
		}
		setPWD(password.toString());
	}

	public int getCountAnfragen() {
		return countAnfragen;
	}

	public void setCountAnfragen(int countAnfragen) {
		this.countAnfragen = countAnfragen;
	}
}
